package com.bond.jumper.common.decode;

import com.bond.jumper.common.po.MessageToClient;
import com.bond.jumper.common.po.MessageToServer;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.List;

/**
 * 客户端解码消息
 */
public class MessageToClientDecoder extends ByteToMessageDecoder {

    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
        // 首先检查是否有足够的字节来读取数据长度
        if (byteBuf.readableBytes() < 4) {
            return;
        }

        // 标记当前读取位置，以便在读取失败时可以回退
        byteBuf.markReaderIndex();

        // 读取数据长度
        int length = byteBuf.readInt();
        // 检查是否有足够的字节来读取完整的数据
        if (byteBuf.readableBytes() < length) {
            // 回退读取位置，等待更多数据到达
            byteBuf.resetReaderIndex();
            return;
        }

        byte[] bytes = new byte[length];
        byteBuf.readBytes(bytes); // 读取数据到字节数组

        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
             ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {

            MessageToClient msg = (MessageToClient) objectInputStream.readObject(); // 反序列化对象
            list.add(msg); // 将解码后的对象添加到输出列表中，供后续的ChannelPipeline处理
        } catch (ClassNotFoundException e) {
            throw new IOException("无法找到类", e);
        }
    }
}
